let dbName = 'media'
let dbPath = 'media.db'
//创建/打开数据库。不存在则创建并打开，存在则打开
function openSqlite() {
	//这plus.sqlite只在手机APP上运行，记得要在打包模块设置勾选“sqlite”数据库。
	return new Promise((resolve, reject) => {
		plus.sqlite.openDatabase({
			name: dbName, //数据库名称
			path: '_doc/' + dbPath, //数据库地址，uniapp推荐以下划线为开头
			success(e) {
				resolve(e); //成功回调
				console.log("成功打开数据库");
			},
			fail(e) {
				reject(e); //失败回调
			}
		})
	})
}

//在该数据库里创建表格
//userInfo是表格名。
//括号里是表格的结构，列，这里我写了四列，list,id,gender,avatar这四列
//list后面大写的英文是自动增加的意思，因为表格里的每一行必须有唯一标识
//这sql语句会数据库的应该都看的懂，我是前端菜鸡，所以详细说明以便跟我一样不懂sql的前端看
//"id" TEXT  意思是这一列放的值为字符串之类的，如果是想存数字之类的就改为INTEGER
//数据库不能存对象，数组
function userInfoSQL() {
	return new Promise((resolve, reject) => {
		//创建表格在executeSql方法里写
		plus.sqlite.executeSql({
			name: dbName,
			//表格创建或者打开，后面为表格结构
			sql: 'create table if not exists userInfo("list" INTEGER PRIMARY KEY AUTOINCREMENT,"id" TEXT,"name" TEXT,"gender" TEXT,"avatar" TEXT)',
			success(e) {
				resolve(e);
			},
			fail(e) {
				reject(e);
			}
		})
	})
}

/**
 * @param {Object} dbName  表名称
 * @param {Object} sql     sql语句
 */
function addTable(dbName, sql) {
	plus.sqlite.selectSql({
		name: dbName,
		sql: sql,
		success: function(data) {
			console.log(data, '---------------')
		},
		fail: function(e) {
			console.log('selectSql failed: ' + JSON.stringify(e));
		}
	});
}

/**
 * @param {Object} dbName  数据库名称
 * @param {Object} sql   sql语句
 */
function addTableData(dbName, sql) {
	plus.sqlite.selectSql({
		name: dbName,
		sql: sql,
		success: function(data) {
			console.log('添加数据成功',data)
		},
		fail: function(e) {
			console.log('selectSql failed: ' + JSON.stringify(e));
		}
	});
}



//向表格里添加数据
//根据表格的列来添加信息
//因为list列我设为自动增加，所以不用添加数据
//values里是传过来要存的值，我这里是动态的，单引号加双引号拼接
function addUserInformation(obj) {
	//判断有没有传参
	if (obj !== undefined) {
		//判断传的参是否有值
		var b = (JSON.stringify(obj) == "{}");
		if (!b) {
			//obj传来的参数对象
			var id = obj.id || null; //id
			var name = obj.name || null; //名称
			var gender = obj.gender || null; //性别
			var avatar = obj.avatar || null; //头像
			return new Promise((resolve, reject) => {
				plus.sqlite.executeSql({
					name: dbName,
					sql: 'insert into userInfo(id,name,gender,avatar) values("' + id + '","' + name +
						'","' + gender + '","' + avatar + '")',
					success(e) {
						resolve(e);
					},
					fail(e) {
						reject(e);
					}
				})
			})
		} else {
			return new Promise((resolve, reject) => {
				reject("错误添加")
			})
		}
	} else {
		return new Promise((resolve, reject) => {
			reject("错误添加")
		})
	}
}

//查询获取数据库里的数据
//根据传过来的值来获取信息，我这里写了可以有两个条件来获取，都是动态的
//第一个参数为表格名，aa,bb分别为列名和列的值 ， cc,dd同前面
//传的参数按1,3,5来传，传一个，传三个，传五个参数，不能只传两个或者四个
function selectInformationType(name, aa, bb, cc, dd) {
	if (name !== undefined) {
		//第一个是表单名称，后两个参数是列表名，用来检索
		if (aa !== undefined && cc !== undefined) {
			//两个检索条件
			var sql = 'select * from ' + name + ' where ' + aa + '=' + bb + ' and ' + cc + '=' + dd + '';
		}
		if (aa !== undefined && cc == undefined) {
			//一个检索条件
			var sql = 'select * from ' + name + ' where ' + aa + '=' + bb + '';
		}
		if (aa == undefined) {
			var sql = 'select * from ' + name + '';
		}
		return new Promise((resolve, reject) => {
			plus.sqlite.selectSql({
				name: dbName,
				sql: sql,
				success(e) {
					resolve(e);
				},
				fail(e) {
					reject(e);
				}
			})
		})
	} else {
		return new Promise((resolve, reject) => {
			reject("错误查询")
		});
	}
}

//删除数据库里的数据
//参数跟上面查询获取数据一样
//传的参数按1,3,5来传，传一个，传三个，传五个参数，不能只传两个或者四个
function deleteInformationType(name, sol, qq, ww, ee) {
	if (name !== undefined && sol !== undefined) {
		//listId为表名,后面两个是列表名，检索用的
		if (ww !== undefined) {
			//两个检索条件
			var sql = 'delete from ' + name + ' where ' + sol + '="' + qq + '" and ' + ww + '=' + ee + '';
		} else {
			//一个检索条件
			var sql = 'delete from ' + name + ' where ' + sol + '="' + qq + '"';
		}
		return new Promise((resolve, reject) => {
			plus.sqlite.executeSql({
				name: dbName,
				sql: sql,
				success(e) {
					resolve(e);
				},
				fail(e) {
					reject(e);
				}
			})
		})
	} else {
		return new Promise((resolve, reject) => {
			reject("错误删除")
		});
	}
}

//修改数据表里的数据
//第一个参数为表格名，name为要修改的列名，cont为要修改为什么值，use,sel为搜索条件，分别是列名和列值
//传的参数按1,3,5来传，传一个，传三个，传五个参数，不能只传两个或者四个
function modifyInformation(listName, name, cont, use, sel) {
	//表格名，要修改地方的列名，修改后的内容，修改条件查询，列名，内容
	var sql;
	if (use == undefined) {
		sql = 'update ' + listName + ' set ' + name + '="' + cont + '"';
	} else {
		sql = 'update ' + listName + ' set ' + name + '="' + cont + '" where ' + use + '="' + sel + '"';
	}
	//where前面的是要修改的，后面的是条件，选择哪个
	return new Promise((resolve, reject) => {
		plus.sqlite.executeSql({
			name: dbName,
			sql: sql,
			success(e) {
				resolve(e);
			},
			fail(e) {
				reject(e);
			}
		})
	})
}

//关闭数据库
function closeSQL(name) {
	return new Promise((resolve, reject) => {
		plus.sqlite.closeDatabase({
			name: dbName,
			success(e) {
				resolve(e);
			},
			fail(e) {
				reject(e);
			}
		})
	})
}

//监听数据库是否开启  name数据库名称
function isOpen(name, path) {
	var ss = name || dbName;
	var qq = path || '_doc/' + dbPath;
	//数据库打开了就返回true,否则返回false
	var open = plus.sqlite.isOpenDatabase({
		name: ss,
		path: qq
	})
	return open;
}

//一次获取指定数据条数
//不想一次性把数据全拿过来就可以这样写
//id为表格名，desc代表倒序拿数据，正常是从第一条开始拿，倒序就从最后一条也是最新的一条数据开始拿
//limit 15 offset '+num+''，后面这是两个单引号，这句的意思是跳过多少条拿15条数据，num是动态值
//比如你刚开始给num设为0，那就从最后面的数据开始拿15条，你下次肯定不想再拿刚刚获取到的数据，所以可以让num为15，这样就能一步一步的拿完所有的数据
function pullSQL(tableName, num) {
	//id为表名，num为跳过多少条数据
	//根据list来倒序拿数据，跳过num条拿取15条
	return new Promise((resolve, reject) => {
		plus.sqlite.selectSql({
			name: dbName,
			sql: 'select * from ' + tableName + ' order by list desc limit 15 offset ' + num + '',
			success(e) {
				resolve(e);
			},
			fail(e) {
				reject(e);
			}
		})
	})
}
//判断表是否存在
function isTable(name, tabName) {
	return new Promise((resolve, reject) => {
		plus.sqlite.selectSql({
			name: name,
			sql: `select count(*) as isTable FROM sqlite_master where type='table' and name='${tabName}'`,
			success(e) {
				resolve(e[0].isTable ? true : false);
			},
			fail(e) {
				console.log(e)
				reject(e);
			}
		})
	})
}
/**
 * 检查指定数据库中的表是否存在（增强版）
 * @param {string} dbPath - 数据库路径（如'_doc/media.db' ）
 * @param {string} tableName - 需检查的表名 
 * @returns {Promise<boolean>} 表是否存在 
 */
export const safeIsTable = async (dbPath, tableName, dbName) => {
	// 参数标准化处理 
	const normalizedPath = dbPath.startsWith('_doc/') ? dbPath : `_doc/${dbPath}`;
	// const dbName = normalizedPath.split('/').pop().replace('.db', '');

	try {
		// 阶段一：智能连接控制 
		const isConnected = await new Promise(resolve => {
			// 先尝试快速检测 
			if (plus.sqlite.isOpenDatabase({
					name: dbName
				})) {
				return resolve(true);
			}

			// 完整连接流程 
			plus.sqlite.openDatabase({
				name: dbName,
				path: normalizedPath,
				success: () => resolve(true),
				fail: () => resolve(false)
			});
		});

		console.log("isConnected", isConnected);
		if (!isConnected) {
			let open = isOpen(dbName,dbPath)
		}

		// 阶段二：安全查询（三重验证机制）
		const verificationSteps = [
			// 方法1：常规查询 
			async () => {
					const res = await plus.sqlite.selectSql({
						name: dbName,
						sql: `SELECT name FROM sqlite_master WHERE type='table' AND name='${tableName.replace(/'/g,  "''")}'`
					});
					return res.length > 0;
				},

				// 方法2：事务测试（iOS兼容方案）
				async () => {
					try {
						await new Promise((resolve, reject) => {
							plus.sqlite.executeSql({
								name: dbName,
								sql: `BEGIN; SELECT * FROM ${tableName} LIMIT 1; COMMIT;`,
								success: resolve,
								fail: reject
							});
						});
						return true;
					} catch {
						return false;
					}
				}
		];

		// 并行执行验证方案 
		const results = await Promise.all(verificationSteps.map(fn => fn().catch(() => false)));
		return results.some(Boolean);

	} catch (e) {
		console.error(`[checkTable]  验证异常:`, e);
		return false;
	} finally {
		// 避免长期占用连接（生产环境建议保持连接） 
		// plus.sqlite.closeDatabase({  name: dbName });
	}
}

//插入数据
// function insertListChatRow(data, dbTable, dbName) {
// 	data = data;
// 	let sql = '';
// 	for (let i = 0; i < data.length; i++) {
// 		sql = "insert into " + dbTable + " values('" + data[i].id + "','" + data[i].content +
// 			"','" + data[i].fromId + "','" + data[i].toId + "'," + data[i].flag + ")";
// 		 addTable(dbName, sql)
// 	}
// }
//查询数据
// function selectSql(dbTable,dbName) {
// 	let curPage = 1
// 	let pageSize = 20
// 	let sql = 'select * from ' + dbTable  +
// 		' limit ' + pageSize + ' offset ' + (curPage - 1) * pageSize;
// 	return addTable(dbName,sql)
// }
//把这些方法导出去
export default {
	openSqlite,
	userInfoSQL,
	addUserInformation,
	selectInformationType,
	deleteInformationType,
	pullSQL,
	isOpen,
	closeSQL,
	modifyInformation,
	isTable,
	safeIsTable,
	addTable,
	// insertListChatRow,
	// selectSql,
	addTableData
}